﻿namespace SimpleArrays
{
    public class Program
    {
        public static void Main()
        {
            Diver[] diver = CopyArrays();
            Console.WriteLine("开始打印CopyArrays()方法数据！");
            Console.WriteLine("————————————————————————————");
            foreach (Diver p in diver)
            {
                Console.WriteLine("国家跳水女队的有：" + p.Name + "，"+"她今年：" + p.Age + "岁。");
            }
            Console.WriteLine("————————————————————————————");
            Console.WriteLine("打印CopyArrays()方法数据结束！");


            Diver[] diver2 = SimpleArrays();
            Console.WriteLine("开始打印SimpleArrays()方法数据！");
            Console.WriteLine("————————————————————————————");
            foreach (Diver p in diver2)
            {
                Console.WriteLine("国家跳水女队的有：" + p.Name + "，" + "她今年：" + p.Age + "岁。");
            }
            Console.WriteLine("————————————————————————————");
            Console.WriteLine("打印SimpleArrays()方法数据结束！");
            Console.ReadLine();
            Console.ReadLine();
        }

        /// <summary>
        /// 简单的数组创建
        /// </summary>
        /// <returns></returns>
        public static Diver[] SimpleArrays()
        {
            /*var diver = new Diver[3];
            diver[0] = new Diver("郭晶晶", 43);
            diver[1] = new Diver("伏明霞", 46);
            diver[2] = new Diver("全红禅", 17);*/

            Diver[] diver2 =
                [
                    new ("郭晶晶", 43),
                    new ("伏明霞", 46),
                    new ("全红禅", 17)

                ];
            //return diver;
            return diver2;
        }

        /// <summary>
        /// 此方法克隆一个数组并返回
        /// </summary>
        /// <returns></returns>
        public static Diver[] CopyArrays()
        {
            Diver[] divingteam =
                [
                    new Diver("郭晶晶", 43),
                    new ("伏明霞", 46),       // 新语法
                    new ("全红禅", 17)
                ];

            // Diver[] divingteamClone = (Diver[])divingteam.Clone();
            // return divingteamClone;
            Diver[] _ = (Diver[])divingteam.Clone();   // 最新语法
            return _;
            // 如果不需要返回值，可以简化成 _ = (Diver[])divingteam.Clone();
        }

        public record Diver(string Name, int Age);
    }
}
// record 特性
// C#9.0中引入的一个新特性，它提供了一种更简洁的方式来定义不可变的数据结构。
// 使用record关键字，你可以轻松创建一个包含不可变属性的类型，而无需编写大量的样板代码。
// record类型还支持值相等性，这意味着两个record实例如果包含相同的值，则被认为是相等的。
// 在这个例子中，Diver(跳水运动员)是一个record类型，它有两个不可变的属性：Name和Age。
// 当你创建一个Diver实例时，你需要提供这两个属性的值，并且之后不能更改它们。
// Record的特性具有以下特点：
// 不可变性： record的属性在对象创建后是不可变的。
// 值相等性： 两个record对象如果包含相同的值，则被认为是相等的。
// 简洁的语法： 使用record关键字可以大大减少定义不可变类型所需的代码量。
// 支持继承： record类型可以继承自其他record类型或类，但不能继承自接口或结构体。
// 自动解构： record支持自动解构，这意味着你可以轻松地从record中提取值。
/**  解构示例
 * public record Diver(string name, int age)
 * var (name, age) = Diver;  
 * Console.WriteLine(name); // 输出: Alice  
 * Console.WriteLine(age); // 输出: 30
 */
// 在这个例子中，我们使用解构来从Diver对象中提取Name和Age属性的值。

// 总的来说，record是C#中一个非常有用的特性，它使得定义和使用不可变数据结构变得更加简单和高效。

